package v1

import (
	"blog/models"
	"blog/pkg/e"
	dto "blog/routers/api/Dto"
	"net/http"
	"strconv"

	"github.com/astaxie/beego/validation"
	"github.com/gin-gonic/gin"
)

// 得到所有标签
// 1. 得到相关的 查询条件
// 2. 组合数据库查询where 条件
// 3. 返回json结果
func GetTags(ctx *gin.Context) {
	var inputTagDto dto.GetTagInput
	cdoe := e.SUCCESS

	// 1. 得到相关的 查询条件
	if err := ctx.BindJSON(&inputTagDto); err != nil {
		cdoe = e.INVALID_PARAMS
		ctx.JSON(http.StatusBadRequest, gin.H{
			"code": cdoe,
			"msg":  e.GetMsg(cdoe),
			"data": nil,
		})
	}

	inputTagDto.Check()

	// 2. 组合数据库查询where 条件
	maps := make(map[string]interface{})
	data := make(map[string]interface{})

	data["lists"] = models.GetTags(inputTagDto.PageIndex, inputTagDto.PageSize, maps)
	data["total"] = models.GetTagTotal(maps)

	// 3. 返回json结果
	ctx.JSON(http.StatusBadRequest, gin.H{
		"code": cdoe,
		"msg":  e.GetMsg(cdoe),
		"data": data,
	})
}

// 新增标签
// 1. 得到相关的 查询条件
// 2. 检查是否重名
// 3. 新增
// 4. 返回
func AddTag(ctx *gin.Context) {
	var inputAddTagDto dto.AddTagInput
	cdoe := e.SUCCESS

	// 1. 得到相关的 查询条件
	if err := ctx.BindJSON(&inputAddTagDto); err != nil {
		cdoe = e.INVALID_PARAMS
		ctx.JSON(http.StatusBadRequest, gin.H{
			"code": cdoe,
			"msg":  e.GetMsg(cdoe),
			"data": nil,
		})
	}

	// 2. 检查是否重名
	if models.ExistTagByName(inputAddTagDto.Name) {
		cdoe = e.ERROR_EXIST_TAG
		ctx.JSON(http.StatusBadRequest, gin.H{
			"code": cdoe,
			"msg":  e.GetMsg(cdoe),
			"data": nil,
		})
	}

	// 3. 新增
	models.AddTag(inputAddTagDto.Name, inputAddTagDto.CreatedBy)

	// 4. 返回
	ctx.JSON(http.StatusBadRequest, gin.H{
		"code": cdoe,
		"msg":  e.GetMsg(cdoe),
		"data": nil,
	})
}

// 修改标签
func EditeTag(ctx *gin.Context) {
	var inputEditTagDto dto.EditeTagInput
	cdoe := e.SUCCESS

	// 1. 得到相关的 查询条件
	if err := ctx.BindJSON(&inputEditTagDto); err != nil {
		cdoe = e.INVALID_PARAMS
		ctx.JSON(http.StatusBadRequest, gin.H{
			"code": cdoe,
			"msg":  e.GetMsg(cdoe),
			"data": nil,
		})
	}

	// 2. 检查是否存在
	if !models.ExistTagById(inputEditTagDto.ID) {
		cdoe = e.ERROR_NOT_EXIST_TAG
		ctx.JSON(http.StatusBadRequest, gin.H{
			"code": cdoe,
			"msg":  e.GetMsg(cdoe),
			"data": nil,
		})
	}

	if !models.ExistTagById(inputEditTagDto.ID) {
		cdoe = e.ERROR_NOT_EXIST_TAG
		ctx.JSON(http.StatusBadRequest, gin.H{
			"code": cdoe,
			"msg":  e.GetMsg(cdoe),
			"data": nil,
		})
	}

	data := make(map[string]interface{})
	data["name"] = inputEditTagDto.Name
	data["CreatedBy"] = inputEditTagDto.CreatedBy

	// 3. 新增
	models.EditTag(inputEditTagDto.ID, data)

	// 4. 返回
	ctx.JSON(http.StatusBadRequest, gin.H{
		"code": cdoe,
		"msg":  e.GetMsg(cdoe),
		"data": nil,
	})
}

// 删除标签
func RemoveTag(ctx *gin.Context) {
	id, _ := strconv.ParseInt(ctx.Param("id"), 10, 64)
	cdoe := e.SUCCESS

	valid := validation.Validation{}
	valid.Min(id, 1, "id").Message("ID必须大于0")

	if valid.HasErrors() {
		cdoe = e.INVALID_PARAMS
		ctx.JSON(http.StatusBadRequest, gin.H{
			"code": cdoe,
			"msg":  e.GetMsg(cdoe),
			"data": nil,
		})
	}

	// 2. 检查是否存在
	if !models.ExistTagById(id) {
		cdoe = e.ERROR_NOT_EXIST_TAG
		ctx.JSON(http.StatusBadRequest, gin.H{
			"code": cdoe,
			"msg":  e.GetMsg(cdoe),
			"data": nil,
		})
	}
	models.DeleteTag(id)

	// 4. 返回
	ctx.JSON(http.StatusBadRequest, gin.H{
		"code": cdoe,
		"msg":  e.GetMsg(cdoe),
		"data": nil,
	})
}
